红葡萄酒质量数据集可视化探索

在这个报告中,我将对包含 1,599 种红酒以及 11 个关于酒的化学成分和物理性质变量的数据集进行可视化探索。

数据集详情见https://s3.amazonaws.com/udacity-hosted-downloads/ud651/wineQualityInfo.txt。

单变量绘图选择

## 'data.frame':    1599 obs. of  13 variables:
##  $ X                   : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ fixed.acidity       : num  7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
##  $ volatile.acidity    : num  0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
##  $ citric.acid         : num  0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
##  $ residual.sugar      : num  1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
##  $ chlorides           : num  0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
##  $ free.sulfur.dioxide : num  11 25 15 17 11 13 15 15 9 17 ...
##  $ total.sulfur.dioxide: num  34 67 54 60 34 40 59 21 18 102 ...
##  $ density             : num  0.998 0.997 0.997 0.998 0.998 ...
##  $ pH                  : num  3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
##  $ sulphates           : num  0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
##  $ alcohol             : num  9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
##  $ quality             : int  5 5 5 6 5 5 5 7 7 5 ...

可以看到数据集中包含了1599个观察值以及13个变量,且所有变量的类型均为数字。

然后查看各个变量的统计学概要。

##        X          fixed.acidity   volatile.acidity  citric.acid   
##  Min.   :   1.0   Min.   : 4.60   Min.   :0.1200   Min.   :0.000  
##  1st Qu.: 400.5   1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090  
##  Median : 800.0   Median : 7.90   Median :0.5200   Median :0.260  
##  Mean   : 800.0   Mean   : 8.32   Mean   :0.5278   Mean   :0.271  
##  3rd Qu.:1199.5   3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420  
##  Max.   :1599.0   Max.   :15.90   Max.   :1.5800   Max.   :1.000  
##  residual.sugar     chlorides       free.sulfur.dioxide
##  Min.   : 0.900   Min.   :0.01200   Min.   : 1.00      
##  1st Qu.: 1.900   1st Qu.:0.07000   1st Qu.: 7.00      
##  Median : 2.200   Median :0.07900   Median :14.00      
##  Mean   : 2.539   Mean   :0.08747   Mean   :15.87      
##  3rd Qu.: 2.600   3rd Qu.:0.09000   3rd Qu.:21.00      
##  Max.   :15.500   Max.   :0.61100   Max.   :72.00      
##  total.sulfur.dioxide    density             pH          sulphates     
##  Min.   :  6.00       Min.   :0.9901   Min.   :2.740   Min.   :0.3300  
##  1st Qu.: 22.00       1st Qu.:0.9956   1st Qu.:3.210   1st Qu.:0.5500  
##  Median : 38.00       Median :0.9968   Median :3.310   Median :0.6200  
##  Mean   : 46.47       Mean   :0.9967   Mean   :3.311   Mean   :0.6581  
##  3rd Qu.: 62.00       3rd Qu.:0.9978   3rd Qu.:3.400   3rd Qu.:0.7300  
##  Max.   :289.00       Max.   :1.0037   Max.   :4.010   Max.   :2.0000  
##     alcohol         quality     
##  Min.   : 8.40   Min.   :3.000  
##  1st Qu.: 9.50   1st Qu.:5.000  
##  Median :10.20   Median :6.000  
##  Mean   :10.42   Mean   :5.636  
##  3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :14.90   Max.   :8.000

对数据集有了基本了解后,开始对单变量进行可视化。

由于fixed.acidity(非挥发性酸度,即酒石酸)、volatile.acidity(可挥发性酸度,即醋酸)以及citric.acid(柠檬酸)三个变量都是对葡萄酒所包含的酸(单位均为 g / dm^3)进行探索,因此可以对三个变量分布绘制直方图后将三幅图放在一起对比其分布。

可以发现fixed.acidityvolatile.acidity两个变量的分布均接近正态分布,但是citric.acid并非呈正态分布。为了更准确地了解这一变量的分布,可以绘制频率多边形,并将binwidth设定为0.01

可以看到citric.acid变量不呈偏态分布,因此无法通过对x轴进行log10sqrt转换来得到正态分布。同时发现分布中存在多处峰值,例如观察值为0.000.490.24以及0.02的时候,因此也不属于均匀分布。

然后对residual.sugar(残糖含量,单位为 g / dm^3)和chlorides(氯化物含量,即盐含量,单位为 g / dm^3)的分布进行查看。

可以通过x轴范围看出红葡萄酒中的盐含量大大小于糖含量。然而两个变量的分布非常相似,均为正态分布。

然后开始对free.sulfur.dioxide(游离二氧化硫含量,单位为 mg / dm^3)和total.sulfur.dioxide(总二氧化硫含量,单位为 mg / dm^3)进行探索。

由于总二氧化硫含量包含了游离二氧化硫的含量,因此total.sulfur.dioxide的x轴右侧范围应当比free.sulfur.dioxide要大,可以从图中证实这一点。

两个变量的分布都为右偏分布,因此可以通过对其x轴进行log10转换来尝试得到正态分布。

转换之后total.sulfur.dioxide的分布非常接近正态分布,而free.sulfur.dioxide的分布稍有些偏差,主要由于转换前观察值为7到9范围的数量相比准确的右偏分布要更少。

现在开始探索density(密度,单位为 g / cm^3)、pH(pH值)、sulphates(硫酸盐含量,单位为 g / cm^3)以及alcohol(酒精含量,单位为百分比)。

可以看到densitypH的分布接近正态,而sulphatesalcohol的分布接近右偏分布。因此,还是对sulphatesalcohol的x轴进行log10转换以尝试得到正态分布。

转换之后sulphates的分布非常接近正态分布,而alcohol的分布稍有些偏差,主要由于转换前观察值为8到9的数量相比准确的右偏分布要更少。

接下来,对quality(葡萄酒评级,评分在0分到10分之间)变量进行探索。

可以看到得到质量中等(评分为5分或6分)的葡萄酒数量相比质量较差(评分为3分和4分)以及质量较好(评分为7分和8分)要更多,且在此数据集中不包含极端质量的葡萄酒,具体来说是评分为1分和2分的质量极低葡萄酒和评分为9分和10分的质量极高的葡萄酒。

对了让后续分组探索更加方便,可以创建quality.group变量并根据quality对葡萄酒进行分组。具体规则是quality34的葡萄酒被分入quality.grouplow组,quality56的葡萄酒被分入quality.groupmedium组,quality78的葡萄酒被分入quality.grouphigh组。

创建quality.group这个factor类型的变量后,以后就可以再对各个数值变量进行分组探索,目的在于寻找哪个单变量是造成葡萄酒评级差异的关键因素。

fixed.acidity变量在分组后绘制的直方图如下。

可以看到,质量较高的葡萄酒的fixed.acidity分布的峰值似乎略微高于质量较低的葡萄酒,然而由于lowhigh组的葡萄酒质量较少,并不能对此关系给出确定的结论。

volatile.acidity变量在分组后绘制的直方图如下。

从上图看出volatile.acidityquality似乎并不存在显著关联。

citric.acid变量在分组后绘制的直方图如下。

从上图中看出citric.acidquality似乎并不存在显著关联。

residual.sugar变量在分组后绘制的直方图如下。

从上图看出residual.sugarquality似乎并不存在显著关联。

chlorides变量在分组后绘制的直方图如下。

从上图看出chloridesquality似乎并不存在显著关联。

free.sulfur.dioxide变量在分组后绘制的直方图如下。

从上图看出free.sulfur.dioxidequality似乎并不存在显著关联。

total.sulfur.dioxide变量在分组后绘制的直方图如下。

从上图看出total.sulfur.dioxidequality似乎并不存在显著关联。

density变量在分组后绘制的直方图如下。

从上图看出,high组葡萄酒的density分布中心的值要低于mediumlow组,说明密度和葡萄酒质量可能存在联系,且具体猜测为质量较高的葡萄酒密度更低。

然而,low组分布的峰值和medium组分布的峰值在上图中不存在差异,而且先前提到的low组和high组观察值较少的问题也给这一观察结论造成了某种程度上的不确定性。

pH变量在分组后绘制的直方图如下。

从上图看出pHquality似乎并不存在显著关联。

sulphates变量在分组后绘制的直方图如下。

从上图看出sulphatesquality似乎并不存在显著关联。

alcohol变量在分组后绘制的直方图如下。

从上图看出,质量较高的葡萄酒中酒精百分比大于10%的数量占比似乎略高于其它组,然而仅从图中无法得到质量高的葡萄酒酒精含量普遍较高的结论。

单变量分析

你的数据集结构是什么?

原数据集包含了1599个观察值以及13个变量,且其中所有变量的类型均为数字。

你的数据集内感兴趣的主要特性有哪些?

我在此数据集内感兴趣的主要特征在于葡萄酒的评级,即quality这列变量的值,原因是除了第一列X以外,其它列均为葡萄酒在化学和物理方面的特征的数值,因此我希望探索那些化学特征变量是如何与葡萄酒评级关联的。

你认为数据集内哪些其他特征可以帮助你探索兴趣特点?

我认为除了X列以外,其它变量均可以作为输入变量来帮助我探索quality这一输出变量。

根据数据集内已有变量,你是否创建了任何新变量?

为了对不同质量的葡萄酒进行分组探索,我根据数据集中quality的值增加了一列名为quality.group类型为factor的变量。

在已经探究的特性中,是否存在任何异常分布?你是否对数据进行一些操作,如清洁、调整或改变数据的形式?如果是,你为什么会这样做?

此数据集不存在整洁度和质量方面的问题,因此我直接跳过了数据清洗的过程。 在上面对各个变量绘制直方图的过程中,我发现每个图基本或多或少都存在一定数量的异常值。然而,我只对residual.sugarchlorides这两个变量进行了x轴上99%分位数的范围限定,原因是这两个变量存在距离分布的中心非常远的异常值,而其它变量的异常值虽然存在但是距离分布的中心并不远,不会影响直方图的呈现。 大部分变量的直方图分布都呈正态,除了free.sulfur.dioxidetotal.sulfur.dioxidesulphates以及alcohol这四个变量的分布呈右偏,因此我选择对其x轴进行log10转换,以尝试得到正态分布。

双变量绘图选择

对于双变量的绘图,我首先对根据经验推测会存在关联的变量绘制散点图,以验证它们之间的关系。

首先,由于pH值是一个用于衡量酸碱值的指标,我猜测fixed.aciditypH存在线性关系。

从上面的散点图中可以看出线性趋势的存在,为了使这一趋势更加明显,计算各个fixed_acidity对应的平均pH值后绘制折线图,并利用geom_smooth来得到线性预测。

可以看到折现的走势和线性回归模型的预测较为接近,因此pHfixed.acidity存在一定程度上的线性关系。

然后通过相关系数验证这一线性关系的强度。

## [1] -0.6829782

由于得到的相关系数的绝对值约为0.7,这一线性关系的相关性较强。

验证了fixed.aciditypH的关系后,我猜测volatile.aciditypH可能也存在较强的线性关系,因此继续通过散点图来进行探索。

然而上面得到的散点图很难看出线性关系,因此继续用相关系数进行检验。

## [1] 0.2349373

得到的相关系数约为0.2,说明volatile.aciditypH并不存在较强的线性关系,推翻了先前的预测。

接下来,我选择对densityalcohol变量绘制散点图,原因是酒精的密度相比水更小,我推测葡萄酒的酒精含量越高,密度越小。

散点图中可以隐约看出向下的线性趋势,但是相关强度还是需要通过计算相关系数才能得到。

## [1] -0.4961798

相关系数的计算结果约为-0.5,说明densityalcohol之间存在中等强度的线性相关性。

下面对free.sulfur.dioxidetotal.sulfur.dioxide两个变量进行探索,原因是总二氧化硫的含量必然包含了游离二氧化硫的含量。

可以看到散点图的顶端和右端存在几个异常值,拉大了x轴和y轴的范围,因此通过free.sulfur.dioxidetotal.sulfur.dioxide两个变量上端的99%分位数来过滤掉那几个异常值。

去除异常值后可以看到,放大后的散点图在左下端部分较为集中,在右上端部分较为分散。我还可以再次通过计算各个free.sulfur.dioxide的平均total.sulfur.dioxide值后绘制折线图,并利用geom_smooth得到线性预测。

通过折线图和线性模型的直线,可以从中看出较为明显的向上趋势。

然后还是通过计算相关系数来得到这一线性关系的强度。

## [1] 0.6676665

结果约为0.7,说明这一线性关系的强度较强,且方向为正。

接下来,我将利用箱线图来探索quality.group和其它变量之间的关系。

从上面四幅箱线图的中位数线可以看出,fixed.aciditycitric.acidityquality的评级似乎呈正向关系,而volatile.acidityquality的评级似乎呈负相关系。

在先前对单一变量的分组探索过程中,通过直方图只能从以上四个变量中看出fixed.acidityquality.group之间存在联系,原因是我在观察直方图时主要注意点在分布的峰值上面,即众数,而这里的箱线图突出显示的是中位数。

从上面四副箱线图中无法通过中位数看出四个变量中任何一个与quality.group之间的联系。

上面三幅箱线图展示了`sulphates各组中位数和quality.group的正向关系,以及pH各组中位数和quality.group的负向关系。

对于alcohol变量,质量较高的葡萄酒的酒精含量大部分都高于质量中等和质量较差的葡萄酒,然而质量中等的葡萄酒的酒精含量并并不比质量较差的葡萄酒要更高,因此这里无法通过箱线图展现的中位数线得到alcoholquality.group之间的正向关系。

双变量分析

探讨你在这部分探究中观察到的一些关系。这些感兴趣的特性与数据集内其他特性有什么区别?

在这一部分中,我首先对根据经验猜测存在关联的变量进行了可视化探索,通过散点图和折线图观察到了fixed.aciditypH还有densityalcohol之间的负线性相关关系,以及total.sulfur.dioxidefree.sulfur.dioxide之间的正线性相关关系。接下来我对各个变量与quality.group绘制了箱线图,通过各个中位数线观察到了fixed.aciditycitric.acid以及sulphatesquality.group的正向关系,以及volatilepHquality.group的负向关系。其它特征则没有在图中展现出明显的相关关系。

你是否观察到主要特性与其他特性之间的有趣关系?

从箱线图的中位数线来看,作为主要特征,quality.groupfixed.aciditycitric.acid以及sulphates存在正向关系,与volatilepH存在负向关系。

你发现最强的关系是什么?

我发现的最强的关系存在于fixed.aciditypH之间,因为通过计算得到线性相关度约为-0.7,说明是较强的负线性相关关系。

多变量绘图选择

我首先会对在上一个部分发现的存在线性关系的双变量引入quality.group作为第三个变量,探索对于不同质量的葡萄酒其线性关系是否继续保持。

在双变量可视化探索中发现存在线性关系的变量组有:fixed.aciditypHdensityalcohol以及free.sulfur.dioxidetotal.sulfur.dioxide

首先探索pH vs.fixed.acidity

可以看到由于三条直线几近重合,说明对于不同的quality.groupfixed.aciditypH之间的线性关系不存在太大差异,即,当fixed.acidity的值相同时,不同质量葡萄酒的pH值相差不大。

接下来对density vs. alcohol进行探索。

可以看到三条线性预测直线的方向相同都是朝下,然而high斜率的绝对值大于medium,而medium斜率的绝对值又大于low,说明根据上图的线性回归来预测的话,质量高的葡萄酒酒精含量越高,密度下降就可能越大。同时还可以推测,酒精含量相同且小于13%时,高质量的葡萄酒密度可能会更大。

然后进行total.sulfur.dioxide vs. free.sulfur.dioxide的探索。

可以发现无论从散点图还是线性模型来看,葡萄酒的质量似乎不会对free.sulfur.dioxidetotal.sulfur.dioxide之间的关系产生什么影响。

在上一部分的双变量探索中,我还通过箱线图的中位数线发现了可能对quality.group有影响的变量,例如fixed.acidityvolatile.aciditycitric.acidsulphates

在下面的可视化过程中,我会将这些特征作为y轴的值,然后将其它特征作为x轴的值,然后引入quality.group变量作为颜色来增加粒度,目的是探索当其它条件发生变化时这些特征对quality.group的影响是否产生变化。

首先探究fixed.acidityresidual.sugar变化时与quality.group的关系。

从上面的三条线性模型的位置可以看出,residual.sugar发生变化的时候,fixed.acidityquality.group的关系依旧是正向的,即酒石酸含量越高的红葡萄,质量评级也可能越高,不论其残糖含量处于哪个范围。

从线性模型的斜率来看,对于质量中等和较好的葡萄酒,其残糖含量和非挥发性酸含量似乎存在正向联系,而对于质量较差的葡萄酒,这一关系则不明显。

除了利用散点图和平滑器,我还可以通过计算各个0.5范围的residual.sugar对应的fixed.acidity平均值来绘制折线图,从而能够从另一个角度来展示这三个变量之间的关系。

从折线图来看,先前线性回归模型的斜率展示的残糖含量和非挥发性酸之间的正向关系变得不明显了,原因是线性回归无法很好地展示非单调性关系,因此可能会从中得到不准确结论。

然而,从折线图中得到的以下结论与线性回归模型一致:不论residual.sugar的值为多少,fixed.acidityquality.group的影响仍然是正向的。

然后开始探索当pH发生变化时fixed.acidityquality.group的关系。

这里从线性回归模型可以看出,不论pH值如何变化,可挥发性酸的含量越低,葡萄酒的评级也就可能会越高。

下面还是用同样的方法绘制折线图。

从折线图中各个线的位置可以得到的结论与上面的散点图相同,即,volatile.acidityquality.group存在负向关系。

现在开始探索当density发生变化时citric.acidquality.group的关系。

上图的三个线性回归模型均展示了citric.aciddensity的正向关系。同时,回归模型的相对位置也说明了citric.acidquality.group存在正向的影响,即density的变化很可能不会改变“红葡萄酒中柠檬酸的含量越高,葡萄酒的评级也越高”这一现象。

然后对相同的变量绘制折线图。

上图中三条折线的走向肯定了citric.aciddensity之间的正向关系,说明葡萄酒中柠檬酸含量的增长会提升葡萄酒的密度。同时,其相对位置也证明了citric.acidquality.group存在正向的影响。

最后,我对当alcohol发生变化时sulphatesquality.group的关系进行展示。

从上图来看,回归模型的斜率接近0,说明alcoholsulphates之间不存在线性关系。而直线的相对位置则说明sulphatesquality.group可能存在正向联系。

折线的走势说明alcoholsuplphates之间的确不存在线性关系,而high的折线位置最高,medium在中间,low处于低端再次证明了先前散点图中得到的结论,即葡萄酒中硫酸盐含量越高,葡萄酒的质量评级也就可能越高。

多变量分析

探讨你在这部分探究中观察到的一些关系。通过观察感兴趣的特性,是否存在相互促进的特性?

在这一部分中,我观察到了fixed.aciditycitric.acid以及sulphates这三个变量与红葡萄酒的评级存在正向关系,说明这些特征与quality相互促进,而volatile.acidity则与评级存在负向关系。这些发现均与上个部分通过箱线图的中位数线得到的结论相符。

这些特性之间是否存在有趣或惊人的联系呢?

在先前对双变量的探索过程中,我并没有对citric.aciddensity这两个变量进行散点图的可视化,原因是我没有推断出两者之间可能存在的联系。然而,在上面多个变量的探索过程中,我意识到了柠檬酸和葡萄酒密度之间存在正向关系,这是一个有趣的发现。后来经过查阅资料得知,此关系存在的原因是柠檬酸溶液的密度比水更高。

你是否创建过数据集的任何模型?讨论你模型的优缺点。

我为散点图创建了线性回归模型。这一模型的优点在于可以很直观地显示出肉眼难以从较为分散的各个数据点中发现的线性关系;缺点在于线性回归模型对于两个变量之间的非线性关系容易产生误导性,因为其无法在图中展示非单调性特征。


定稿图与总结

绘图一

描述一

从上图可以看出,在此红葡萄酒的数据集中,大部分的葡萄酒的评级都是56,数量超过了600种,评级为47的葡萄酒数量较少,而评级为38的葡萄酒数量就更少了,甚至小于50种。这说明质量中等的葡萄酒要比质量较好或质量较差的葡萄酒更多,且质量越靠近极端数量就越少,这一现象符合正态分布。

绘图二

描述二

从上面四幅箱线图中可以发现,fixed.aciditycitric.acid以及sulphates这三个变量的中位数和quality.group之间存在正向关系,即质量越高的组,这些变量观察值的中位数就越高,而volatile.acidity这一变量的中位数和quality.group之间存在负向关系,即质量越高的组,这一变量观察值的中位数就越低。

绘图三

描述三

从第一幅散点图和线性回归模型中可以看出,pHfixed.acidity之间存在较为明显的负向线性关系,因此可以预测红葡萄酒中非挥发性酸的含量越高,pH值就越低。而且,代表不同质量组的的三条回归线几近重合,说明此线性关系的系数不会随着葡萄酒质量的改变而发生变化。 第二幅折线图则是展示了各个以1为计算区间的fixed.acidity所对应平均pH值。创建此图的目的在于,一是可以验证模型的选择,由于线性模型无法展示非单调性关系,而折线图却可以很好地展示,因此通过折线图可以检查符合的回归模型是否真的应该为线性的;二是查看代表不同质量组的线是否在计算平均值的折线图中依旧维持重合或交缠的状态,由于在上面的折线图中三条线依旧接近重合,验证了通过散点图的回归线得到的结论,即pH值和非挥发性酸含量之间线性关系的系数不会随着葡萄酒质量的改变而发生变化。


反思

在此次通过R语言进行的探索中,我首先利用直方图对各个变量的分布进行了可视化展示,发现了常见的正态分布,例如pH,也发现了个别变量的分布为右偏,例如free.sulfur.dioxide。由于在此次探索我最感兴趣的变量是quality,因此在对葡萄酒质量进行分组后,我再次绘制了各个变量直方图,并根据其分布形状和峰值判断出了fixed.volatile.aciditydensity以及alcohol可能和quality存在关系。当然,这一结论仅根据众数得到,所以可能缺乏准确性。接下来,我通过散点图、折线图、线性回归模型以及相关系数去验证自己根据经验猜测会存在线性关系的双变量,具体为fixed.aciditypHdensityalcohol以及free.sulfur.dioxidetotal.sulfur.dioxide。然后我通过各个变量不同质量组的箱线图发现,fixed.acidityvolatilecitric.acidpH以及sulphates这五个变量与葡萄酒质量有关联,但由于这一判断仅依据箱线图中各组变量观察值的中位数线,无法完全确定。在最后的对多变量进行探索的部分,我通过对先前发现了线性关系的双变量的散点图进行根据质量的分组,然后通过分组后的线性回归模型再次验证了那些线性关系的系数不会随着不同质量组而发生变化。

分析阶段中遇到的主要困难在于,不同质量的葡萄酒在数据集中数量相差很大,比如评级为3的葡萄酒数量只有不到 20 种,而评级为5的葡萄酒数量则超过了 650 种。这一现象符合正态分布,然而也造成了散点图上各组数据点的数量不均,代表中等质量葡萄酒的数据点占了图中很大一部分面积并且覆盖了其它颜色数据点,因此难以通过数据点的颜色分组看出端倪。我的解决方式是首先调整数据点的透明度,避免完全覆盖,然后通过线性回归模型展现肉眼难以看出的关系。

分析阶段取得成功的例子是,在对双变量进行可视化探索的阶段,我顺利找到了三组线性关系较强的双变量,并且通过相关系数进行了验证。

如果在后续阶段继续完善这个报告,我可能会尝试从统计学和多变量的回归模型入手。推论统计学可以利用数据计算验证可视化过程中产生的猜测,而建立多变量的回归模型之后就可以通过葡萄酒各个属性的参数对其质量评级直接进行预测。

参考网站

http://ggplot2.tidyverse.org/reference/scale_brewer.html

https://s3.cn-north-1.amazonaws.com.cn/static-documents/nd002/DataAnalysiswithRCreatingEffectivePlots.pdf

http://www.sthda.com/english/wiki/ggplot2-themes-and-background-colors-the-3-elements

https://s3.amazonaws.com/udacity-hosted-downloads/ud651/wineQualityInfo.txt